package com.arpa.oms.service;

import com.arpa.oms.domain.entity.OmsInbound;
import com.arpa.oms.domain.entity.OmsOutbound;
import com.arpa.oms.domain.entity.OmsPayable;
import com.arpa.oms.domain.entity.OmsReceivable;
import com.arpa.wms.domain.dto.ExpenseDetailSettlementDTO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 * OMS结算管理服务类
 * </p>
 *
 * @author LEO
 * @since 2020-12-21
 */
public interface IOmsSettlementService{

    /**
     * 生成OMS付款信息
     * 采购单、采购退货单，生成入库单后调用此方法生成付款信息。
     * 原始单据如果已付款，则生成应付明细的同时，生成付款单及付款单明细，已结算金额为已付款金额。
     * @param omsInbound 入库单信息{@link OmsInbound}
     */
    void generatePayment(OmsInbound omsInbound);

    /**
     * 生成OMS收款信息
     * 销售单、销售退货单，生成出库单后调用此方法生成收款信息。
     * 原始单据如果已收款，则生成应收明细的同时，生成收款单及收款单明细，已结算金额为已收款金额。
     * @param omsOutbound 入库单信息{@link OmsOutbound}
     */
    void generateReceivable(OmsOutbound omsOutbound);


    /**
     * 生成收款结算单
     * 按客户分组生成多条结算单
     *
     * @param settlement 结算费用
     */
    void receivableSettlement(ExpenseDetailSettlementDTO settlement);

    /**
     * 保存收款单
     *
     * @param omsReceivables
     * @return
     */
    boolean saveOmsReceivable(List<OmsReceivable> omsReceivables);

    /**
     * 生成付款结算单
     * 按供应商分组生成多条结算单
     *
     * @param settlement 结算费用
     */
    void payableSettlement(ExpenseDetailSettlementDTO settlement);

    @Transactional(rollbackFor = {Exception.class})
    boolean saveOmsPayable(List<OmsPayable> omsPayables);
}
